home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / lang / SmallEiffel.lha / SmallEiffel / lib_show / gcd / integer.e < prev    next >
Text File  |  1998-12-22  |  6KB  |  234 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  4. --                       http://www.loria.fr/SmallEiffel
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it 
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later 
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License 
  11. -- for  more  details.  You  should  have  received a copy of the GNU General 
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. expanded class INTEGER
  17.  
  18. inherit
  19.    INTEGER_REF
  20.       redefine
  21.      infix "+", infix "-", infix "*", infix "/",
  22.      infix "\\", infix "//", infix "<",
  23.      compare, prefix "-", prefix "+"
  24.       end;
  25.  
  26. feature {ANY}
  27.    
  28.    infix "+"(other: INTEGER): INTEGER is
  29.      -- Add `other' to Current.
  30.       external "SmallEiffel"
  31.       end;
  32.    
  33.    infix "-" (other : INTEGER): INTEGER is
  34.      -- Subtract `other' from Current.
  35.       external "SmallEiffel"
  36.       end;
  37.  
  38.    infix "*" (other : INTEGER) : INTEGER is
  39.      -- Multiply `other' by Current.
  40.       external "SmallEiffel"
  41.       end;
  42.  
  43.    infix "/" (other : INTEGER): INTEGER is
  44.      -- Divide Current by `other'.
  45.      -- Note : Integer division
  46.       external "SmallEiffel"
  47.       end;
  48.  
  49.    infix "//" (other : INTEGER) : INTEGER is
  50.      -- Divide Current by `other'.
  51.      -- Note : Integer division
  52.       external "SmallEiffel"
  53.       end;
  54.  
  55.    infix "\\" (other : INTEGER) : INTEGER is
  56.      -- Remainder of division of Current by `other'.
  57.       external "SmallEiffel"
  58.       end;
  59.    
  60.    infix "<" (other: INTEGER): BOOLEAN is
  61.      -- Is Current less than `other'?
  62.       external "SmallEiffel"
  63.       end;
  64.  
  65.    prefix "+": INTEGER is
  66.       do
  67.      Result := Current
  68.       end;
  69.  
  70.    prefix "-" : INTEGER is
  71.      -- Unary minus of Current
  72.       external "SmallEiffel"
  73.       end;
  74.    
  75.    compare(other: INTEGER): INTEGER is
  76.      -- Compare Current with `other'.
  77.      -- '<' <==> Result < 0
  78.      -- '>' <==> Result > 0
  79.      -- Otherwise Result = 0
  80.       do
  81.      Result := Current - other
  82.       end;
  83.  
  84.    to_string: STRING is
  85.      -- Convert the INTEGER into a new allocated STRING. 
  86.      -- Note: see `append_in' to save memory.
  87.       do
  88.      !!Result.make(0);
  89.      append_in(Result);
  90.       end; 
  91.  
  92.    append_in(str: STRING) is
  93.      -- Append the equivalent of `to_string' at the end of 
  94.      -- `str'. Thus you can save memory because no other
  95.      -- STRING is allocate for the job.
  96.       require
  97.      str /= Void;
  98.       local
  99.      val, i: INTEGER;
  100.       do
  101.      if Current = 0 then
  102.         str.extend('0');
  103.      else
  104.         if Current < 0 then
  105.            str.extend('-');
  106.            (- Current).append_in(str);
  107.         else
  108.            from
  109.           i := str.count + 1;
  110.           val := Current;
  111.            until
  112.           val = 0
  113.            loop
  114.           str.extend((val \\ 10).digit);
  115.           val := val // 10;
  116.            end;
  117.            from  
  118.           val := str.count;
  119.            until
  120.           i >= val
  121.            loop
  122.           str.swap(i,val);
  123.           val := val - 1;
  124.           i := i + 1;
  125.            end;        
  126.         end;
  127.      end;
  128.       end; 
  129.    
  130.    to_string_format(s: INTEGER): STRING is
  131.      -- Same as `to_string' but the result is on `s' character and the 
  132.      -- number is right aligned. 
  133.      -- Note: see `append_in_format' to save memory.
  134.       require
  135.      to_string.count <= s;
  136.       do
  137.      from  
  138.         tmp_string.clear;
  139.         append_in(tmp_string);
  140.      until
  141.         tmp_string.count >= s
  142.      loop
  143.         tmp_string.add_first(' ');
  144.      end;
  145.      Result := clone(tmp_string);
  146.       ensure
  147.      Result.count = s;
  148.       end; 
  149.  
  150.    append_in_format(str: STRING; s: INTEGER) is
  151.      -- Append the equivalent of `to_string_format' at the end of 
  152.      -- `str'. Thus you can save memory because no other
  153.      -- STRING is allocate for the job.
  154.       do
  155.      from
  156.         tmp_string.clear;
  157.         append_in(tmp_string);
  158.      until
  159.         tmp_string.count >= s
  160.      loop
  161.         tmp_string.add_first(' ');
  162.      end;
  163.      str.append(tmp_string);
  164.       ensure
  165.      str.count >= (old str.count) + s;
  166.       end;
  167.    
  168.    digit: CHARACTER is
  169.      -- Gives the corresponding CHARACTER for range 0..9.
  170.       require
  171.      0 <= Current;
  172.      Current <= 9;
  173.       do
  174.      Result := ("0123456789").item(Current + 1);
  175.       ensure
  176.      ("0123456789").has(Result);
  177.      Result.value = Current;
  178.       end;
  179.       
  180.    gcd(other: INTEGER): INTEGER is
  181.      -- Great Common Divisor of `Current' and `other'.
  182.       require
  183.      Current > 0;
  184.      other > 0;
  185.       local
  186.      the_other: INTEGER;
  187.       do
  188.      from  
  189.         Result := Current;
  190.         the_other := other;
  191.      invariant
  192.         Result > 0;
  193.         the_other > 0;
  194.         Result.gcd(the_other) = Current.gcd(other);
  195.      variant
  196.         Result.max(the_other)
  197.      until
  198.         Result = the_other
  199.      loop
  200.         if Result > the_other then
  201.            Result := Result - the_other;
  202.         else
  203.            the_other := the_other - Result;
  204.         end;
  205.      end;
  206.       ensure
  207.      Result = other.gcd(Current);
  208.       end;
  209.    
  210. feature {NONE}
  211.    
  212.    tmp_string: STRING is "0123456789";
  213.      
  214.    to_character_table : STRING is "%
  215.      %%/000/%/001/%/002/%/003/%/004/%/005/%/006/%/007/%
  216.      %%/008/%/009/%/010/%/011/%/012/%/013/%/014/%/015/%
  217.      %%/016/%/017/%/018/%/019/%/020/%/021/%/022/%/023/%
  218.      %%/024/%/025/%/026/%/027/%/028/%/029/%/030/%/031/%
  219.      %%/032/%/033/%/034/%/035/%/036/%/037/%/038/%/039/%
  220.      %%/040/%/041/%/042/%/043/%/044/%/045/%/046/%/047/%
  221.      %%/048/%/049/%/050/%/051/%/052/%/053/%/054/%/055/%
  222.      %%/056/%/057/%/058/%/059/%/060/%/061/%/062/%/063/%
  223.      %%/064/%/065/%/066/%/067/%/068/%/069/%/070/%/071/%
  224.      %%/072/%/073/%/074/%/075/%/076/%/077/%/078/%/079/%
  225.      %%/080/%/081/%/082/%/083/%/084/%/085/%/086/%/087/%
  226.      %%/088/%/089/%/090/%/091/%/092/%/093/%/094/%/095/%
  227.      %%/096/%/097/%/098/%/099/%/100/%/101/%/102/%/103/%
  228.      %%/104/%/105/%/106/%/107/%/108/%/109/%/110/%/111/%
  229.      %%/112/%/113/%/114/%/115/%/116/%/117/%/118/%/119/%
  230.      %%/120/%/121/%/122/%/123/%/124/%/125/%/126/%/127/%
  231.      %";
  232.      
  233. end -- INTEGER
  234.